#pragma once
#include <iostream>
using namespace std;

class Date
{
public:
    // 1、编译器默认生成的构造函数 -- 不会对成员变量初始化，输出随机值
    // Date (){}

    // 2、自己定义的默认构造函数 -- 可以自己设置初始值，输出2024-11-20
    // Date ()
    // {
    //     m_year = 2024;
    //     m_month = 11;
    //     m_day = 20;
    // }

    // 3、自己定义的全缺省默认构造函数 -- 通过缺省值初始化，不传参则输出0-0-0
    Date (int year = 0, int month = 0, int day = 0)
    {
        m_year = year;
        m_month = month;
        m_day = day;
        cout << "Date():" << this << endl;
    }
    // 总结：默认的拷贝构造有3种，1、编译器自动生成的；2、自己定义的无参的；3、自己定义的全缺省的构造函数
    // 推荐使用第三种方式，这样既可以无参调用，也可以通过传值进行初始化操作

    // 析构函数
    // 未显示定义时，编译器会自动生成一个默认的析构函数
    ~Date()
    {
        cout << "~Date():" << this << endl;
    }

    // 拷贝构造
    // 传参类型位类类型的引用，传值传参会导致无穷递归
    Date(Date &d)
    {
        m_year = d.m_year;
        m_month = d.m_month;
        m_day = d.m_day;
    }

    
    void print()
    {
        cout << m_year << "-"
             << m_month << "-"
             << m_day << endl;
    }

private:
    int m_year;
    int m_month;
    int m_day;
};

class Date2
{
public:
    void print()
    {
        m_d1.print();
        cout << "m_a:" << m_a << endl;
    }

private:
    int m_a;
    Date m_d1;
};